package com.itcncp.common.pingplusplus;
import com.itcncp.common.pingplusplus.model.Charge;
import com.itcncp.common.pingplusplus.model.Transfer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;

/**
 * ping++支付工具类 
 */
public class PingppUtil {
			/** 
			(支付宝手机支付)。
			参数 extern_token[string] 开放平台返回的包含账户信息的 token（授权令牌，商户在一定时间内对支付宝某些服务的访问权限）。通过授权登录后获取的 alipay_open_id，作为该参数的 value，登录授权账户即会为支付账户，32 位字符串，optional；
			参数 rn_check[string] 是否发起实名校验，optional；
			支付完成将额外返回付款用户的支付宝账号 buyer_account 。
			 */
			public static String alipay = "alipay";
			/** 
			(支付宝手机网页支付)。
			参数 success_url[string] 为支付成功的回调地址，required；
			参数 cancel_url[string] 为支付取消的回调地址，optional；
			支付完成将额外返回付款用户的支付宝账号 buyer_account 。
			 */ 
			public static String alipay_wap = "alipay_wap";
			/** 
			(支付宝 PC 网页支付)。
			参数 success_url[string] 为支付成功的回调地址，required；
			 */ 
			public static String alipay_pc_direct = "alipay_pc_direct";
			/** 
			(微信支付)。
			支付完成将额外返回付款用户的 open_id 和付款银行类型 bank_type。
			 */ 
			public static String wx = "wx";
			/**
			 * (微信公众账号支付)。
			 * 参数 open_id[string] 为用户在商户 appid 下的唯一标识，required；
			 * 支付完成将额外返回付款银行类型 bank_type 。
			 */ 
			public static String wx_pub = "wx_pub";
			/** 
			upacp:银联全渠道支付（2015 年 1 月 1 日后的银联新商户使用。若有疑问，请与 Ping++ 或者相关的收单行联系）
			参数 result_url[string] 为支付完成的回调地址，required；
			 */ 
			public static String upacp = "upacp";
			/** 
			(银联全渠道手机网页支付)。
			参数 result_url[string] 为支付完成的回调地址，required；
			 */ 
			public static String upacp_wap = "upacp_wap";
			/** 
			(银联PC网页支付)。
			参数 result_url[string] 为支付完成的回调地址，required；
			 */ 
			public static String upacp_pc = "upacp_pc";
			/** 
			(银联手机网页支付)。
			参数 result_url[string] 为支付完成的回调地址，required；
			 */ 
			public static String upmp_wap = "upmp_wap";
			/** 
			(百度钱包手机网页支付)。
			参数 result_url[string] 为支付完成的回调地址，required；
			参数 bfb_login[boolean] 为是否需要登录百度钱包来进行支付，required；
			 */ 
			public static String bfb_wap = "bfb_wap";
			/**
			 (微信公众账号扫码支付)。
			 参数 product_id[string] 为商品 ID，1-32 位字符串。此 id 为二维码中包含的商品 ID，商户自行维护，required；
			 支付完成将额外返回付款用户的 open_id 和付款银行类型 bank_type 。
			 */
			public static String wx_pub_qr = "wx_pub_qr";
			/**
			 通联支付
			 */
			public static String allinpay = "allinpay";

    private static final Logger LOGGER = LoggerFactory.getLogger(PingppUtil.class);

	public static Charge pingPay(HashMap<String,Object> chargeParams) {
		
//		Pingpp.apiKey="sk_test_DmH8CGDy1uHGaPOG40Xf1uTG";
		Pingpp.apiKey ="sk_live_CGCWnDe5KiHGXnjbPGSaPqzL";

		HashMap<String,Object> app = new HashMap<String,Object>();
	    app.put("id", Pingpp.appId);
	    chargeParams.put("app",app);

	    chargeParams.put("currency","cny");
	    chargeParams.put("client_ip","123.56.79.35");
	     
		 try {

             LOGGER.error("开始情请求pingxx");

			 Charge charge = Charge.create(chargeParams);

             LOGGER.error("请求结束后");

			 return  charge;

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return null;
		}  
		 
	}

	/**
	 * 通联银行提现处理
	 * @param amount 付款金额
	 * @param orderNo  为 20 ~ 40 位不能重复的数字字母组合，必须以签约的通联的商户号开头（建议组合格式：通联商户号 + 时间戳 + 固定位数顺序流水号，不包含+号）
	 * @param bankcardNo 收款人银行卡号或者存折号
	 * @param authName 收款人姓名
	 * @param bankId 开户银行编号
	 * @param bankcardType 银行卡号类型。0：银行卡、1：存折、2：信用卡。
	 * @param description 备注信息
	 * @return
	 */
	public static Transfer pingTransferAllinpay(String amount,String orderNo, String bankcardNo,
												 String authName,String bankId,Integer bankcardType,
												 String description) {

//		Pingpp.apiKey="sk_test_DmH8CGDy1uHGaPOG40Xf1uTG";
		HashMap<String,Object> transferParams = new HashMap<String, Object>();
		Pingpp.apiKey ="sk_live_CGCWnDe5KiHGXnjbPGSaPqzL";
//		Pingpp.apiKey="sk_test_DmH8CGDy1uHGaPOG40Xf1uTG";

		HashMap<String,Object> app = new HashMap<String,Object>();
		app.put("id", Pingpp.appId);
		transferParams.put("app",app);


		//付款金额
		transferParams.put("amount", amount);
		//付款金额
		transferParams.put("channel", allinpay);
		//为 20 ~ 40 位不能重复的数字字母组合，
		// 必须以签约的通联的商户号开头（建议组合格式：
		// 通联商户号 + 时间戳 + 固定位数顺序流水号，不包含+号）
		transferParams.put("order_no", orderNo);
		//付款类型，转账到个人用户为 b2c，转账到企业用户为 b2b（微信公众号、小程序和余额的企业付款，仅支持 b2c）
		transferParams.put("type", "b2c");
		//三位 ISO 货币代码，目前仅支持人民币:  cny 。
		transferParams.put("currency", "cny");
		//备注信息
		transferParams.put("description",description );


		/**
		 * 附加参数 extra
		 */
		HashMap<String,Object> extra = new HashMap<String,Object>();
		/**
		 * 5位，业务代码，根据通联业务人员提供，
		 * 不填使用通联提供默认值 09900 。详情请参考 通联代付业务代码说明 。
		 * 业务代码	类型
		 * 00601	保险分红 00308	保险给付金 00600	保险理赔 06000	保证金
		 * 00603	大病赔款 05101	代发工资 05102	代发奖金 05105	代发劳务费 05103	代发养老金 05100	代发佣金
		 * 09900	代付其他 09100	汇款 09500	贷款 09001	基金分红 09000	基金赎回 09999	内部调账 09200	商户退款
		 * 00602	退垫付保费 09501	退款 09300	信用卡还款 09400	虚拟账户取现 09998	业务代码摘要测试代付
		 */
		String businessCode = "09900";
		extra.put("business_code", businessCode);
		//收款人银行卡号或者存折号
		extra.put("card_number", bankcardNo);
		//收款人姓名
		extra.put("user_name", authName);
		//4位，开户银行编号，详情请参考
		extra.put("open_bank_code", bankId);
		//1位，银行卡号类型。0：银行卡、1：存折、2：信用卡。不填默认使用银行卡。
		extra.put("card_type", bankcardType);

		transferParams.put("extra",extra);

		try {

			Transfer transfer = Transfer.create(transferParams);

			return transfer;

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			return null;
		}

	}


}
